package com.xiaoyaoji;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * 代码生成器
 */
public class MybatisPlusGenerator {

    public static void main(String[] args) {
        MybatisPlusGenerator.generateByTables("", "project");
    }

    /**
     * 生成代码
     *
     * @param moduleName 模块名
     * @param tableNames 表名
     */
    public static void generateByTables(String moduleName, String... tableNames) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 数据源配置
        MybatisPlusGenerator.setDataSource(mpg);
        // 全局配置
        MybatisPlusGenerator.setGlobalConfig(mpg);
        // 包配置
        MybatisPlusGenerator.setPackageInfo(mpg, moduleName);
        // 策略配置
        MybatisPlusGenerator.setStrategy(mpg, tableNames);
        // 开始执行代码生成
        mpg.execute();
    }

    /**
     * 数据源配置
     *
     * @param mpg
     */
    private static void setDataSource(AutoGenerator mpg) {
        mpg.setDataSource(new DataSourceConfig()
                .setUrl("jdbc:mysql://localhost:3306/xiaoyaoji?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC")
                .setDriverName("com.mysql.cj.jdbc.Driver")
                .setUsername("root")
                .setPassword("admin")
                .setDbType(DbType.MYSQL)
        );
    }

    /**
     * 全局配置
     *
     * @param mpg
     */
    private static void setGlobalConfig(AutoGenerator mpg) {
        mpg.setGlobalConfig(new GlobalConfig()
                // 输出目录
                .setOutputDir(System.getProperty("user.dir") + "/src/main/java")
                // 是否覆盖
                .setFileOverride(true)
                // 开启AR模式
                .setActiveRecord(true)
                // XML二级缓存
                .setEnableCache(false)
                // 生成ResultMap
                .setBaseResultMap(true)
                // 生成 sql片段
                .setBaseColumnList(false)
                // 所有文件的生成者
                .setAuthor("LiYaCai")
                // 自定义文件命名,%s会自动填充表实体类名字
                .setMapperName("%sMapper")
                .setXmlName("%sMapper")
                .setServiceName("I%sService")
                .setServiceImplName("%sServiceImpl")
                .setControllerName("%sController")
        );
    }

    /**
     * 包配置
     *
     * @param mpg
     */
    private static void setPackageInfo(AutoGenerator mpg, String moduleName) {
        mpg.setPackageInfo(new PackageConfig()
                // 基本包路径
                .setParent("com.xiaoyaoji")
                // 模块名
                .setModuleName(moduleName)
                // 设置Controller包名
                .setController("controller")
                // 设置entity包名
                .setEntity("pojo.model")
                // 设置Mapper包名
                .setMapper("dao.mapper")
                // 设置Service包名
                .setService("service")
                // 设置Service实现类包名
                .setServiceImpl("service.impl")
                // 设置Mapper.xml包名
                .setXml("dao.mapper")
        );
    }

    /**
     * 策略配置
     *
     * @param mpg
     */
    private static void setStrategy(AutoGenerator mpg, String... tableNames) {
        mpg.setStrategy(new StrategyConfig()
                // 表名命名规则
                .setNaming(NamingStrategy.underline_to_camel)
                // 列明命名规则
                .setColumnNaming(NamingStrategy.underline_to_camel)
                // 实体是否使用Lombok插件
                .setEntityLombokModel(true)
                // 控制层是否使用Rest风格
                .setRestControllerStyle(true)
                // 需要生成的表
                .setInclude(tableNames)
        );
    }


}
